import { dayjs } from 'element-plus'
import type { App, Plugin } from 'vue'

export const withInstall = <T>(component: T, alias?: string) => {
  const comp = component as any
  comp.install = (app: App) => {
    app.component(comp.name || comp.displayName, comp)
    if (alias) {
      app.config.globalProperties[alias] = component
    }
  }
  return component as T & Plugin
}

/** 白屏时间 */
export const blankTime = () => {
  const t: any = performance.getEntriesByType('navigation')[0]
  const value = (t?.domInteractive ?? t?.domLoading ?? 0) - t?.fetchStart
  return `${value.toLocaleString()}ms`
}

/**
 * 时间戳转日期时间
 * @param {number} date 时间戳
 * @param {string} template 转换格式
 * @returns
 */
export const formatUnix = (
  date: number,
  template: string = 'YYYY-MM-DD HH:mm:ss'
): string => {
  return date ? dayjs.unix(date).format(template) : '-'
}

/**
 * 传入时间的00:00:00/23:59:59 的时间戳  默认 当前时间
 *
 * @param date  { number } 时间
 * @param reverse  { boolean } 如果为 true 那么获取 23:59:59的时间戳 反之 为00:00:00的时间
 * @returns number
 */
export const getUnix = (date?: number, reverse: boolean = false): number => {
  let dateTime = dayjs(date)
  if (typeof date === 'number') {
    dateTime = dayjs.unix(date)
  }
  if (reverse) {
    return dateTime.set('hour', 23).set('minute', 59).set('second', 59).unix()
  }
  return dateTime.set('hour', 0).set('minute', 0).set('second', 0).unix()
}

/**
 * 获取由 LabelValue 构成的 options 数组里指定值的 label
 * @param options
 * @param value
 * @returns
 */
export const getOptionsLabel = (
  options: LabelValue[],
  value: string | number
) => {
  const res = options.find(item => item.value === value)
  return res?.label
}

/**
 * 去空格，去空行
 * @param value string
 * @returns
 */
export function getTrimValue(value: string) {
  return value
    .split(/\n/)
    .map(v => v.trim())
    .filter(Boolean)
}
